4.11. Десктопные приложения
Десктопные приложения - как они создаются?
Десктоп
Толстый и тонкий клиент
Портирование и мультиплатформенность
Виды десктопных приложений - консольное, и иные
Десктоп
Десктоп (от англ. desktop — «рабочий стол») — это термин, обозначающий:
- Физическое устройство: настольный компьютер (в отличие от ноутбука, планшета, смартфона).
- Программное обеспечение: приложения, предназначенные для работы на таких компьютерах — десктопные приложения.
- Интерфейс: графический рабочий стол операционной системы (например, Windows, macOS, Linux), где расположены иконки, панели, окна.
Термин появился в 1980-х годах с развитием персональных компьютеров и графических интерфейсов. Компьютеры стали ассоциироваться с рабочим столом пользователя — метафорой реального стола, на котором лежат документы, папки, инструменты. Apple Macintosh (1984) и позже Windows популяризировали эту концепцию.
Десктопные приложения - это программы, устанавливаемые и запускаемые локально на компьютере пользователя. Они работают независимо от браузера и интернета (хотя могут с ним взаимодействовать). К примеру, Microsoft Word, Photoshop, VLC, Notepad++, Steam, Telegram Desktop.
Кроме десктопных, бывают ещё веб-приложения и мобильные приложения.
Основная особенность десктопных приложений - наличие окна.
Окно — это прямоугольная область на экране, в которой отображается содержимое одного приложения или документа. Позволяет работать с несколькими программами одновременно.
Это часть графического пользовательского интерфейса (GUI) — замена командной строки. Концепция окон была разработана в Xerox PARC в 1970-х годах. Впервые массово внедрена в Apple Lisa (1983) и Macintosh (1984). Позже перенята Microsoft в Windows 1.0 (1985).
Основные особенности десктопных приложений:
- Устанавливаются локально (через инсталлятор, .exe, .dmg, .deb и т.д.).
- Полный доступ к ресурсам компьютера: файловая система, железо (камера, принтер, GPU), реестр (Windows).
- Высокая производительность — прямой доступ к CPU, памяти.
- Могут работать без интернета.
- Поддерживают сложные UI и многозадачность (множество окон, drag-and-drop, горячие клавиши).
- Требуют обновлений (вручную или автоматически).
- Зависят от ОС — Windows, macOS, Linux.
Для разработки десктопных приложений можно использовать почти любой язык:
- C# - WPF, WinForms, MAUI, Avalonia
- C++ - Qt, WinAPI, MFC, wxWidgets
- Java - JavaFX, Swing, AWT
- Python - Tkinter, PyQt, Kivy, PySide
- JavaScript - Electron, Tauri, Neutralino.js
- Rust - Tauri, Slint, Iced
- Go - Fyne, Walk, Gio
Самыми лучшими языками под Windows можно считать именно первые три - C#, C++ и Java. Другие имеют некоторые особенности, но в основном работают медленнее, к примеру, Electron в JS позволяет писать десктопные приложения на HTML/CSS/JS, но они «тяжёлые» (запускают Chromium под капотом). Примеры: VS Code, Slack, Discord.
Программа, запускаемая на компьютере, называется клиентом, который бывает толстым и тонким.
Толстый клиент (Fat / Thick Client):
- Приложение делает большую часть работы локально.
- Хранит логику, данные, UI на компьютере пользователя.
- Минимальная зависимость от сервера.
- Пример: Photoshop, игры, офисные программы.
Тонкий клиент (Thin Client)
- Приложение — в основном интерфейс, логика и данные — на сервере.
- Зависит от интернета и сервера.
- Пример: веб-приложения (Google Docs), терминалы для удалённого доступа.
Десктопные приложения чаще всего — толстые клиенты, но могут быть и гибридными (например, Telegram Desktop — частично локальная логика, частично синхронизация с сервером).
Поскольку десктоп на каждой платформе отличается, порой разработка сначала ведётся под одну платформу, затем адаптируется под другую - это портирование.
Портирование — процесс адаптации программы для работы на другой платформе (например, с Windows на macOS). Требует изменения кода, UI, иногда архитектуры и зачастую бывает трудоёмким. Поэтому программы сейчас пишут изначально с расчётом на возможность работы с разных платформ - это мультиплатформенность.
Мультиплатформенность — способность приложения работать на нескольких ОС без изменений или с минимальными правками. Достигается с помощью кроссплатформенных фреймворков, языков с виртуальной машиной и компиляцией под разные платформы.
Можно выделить следующие виды десктопных приложений:
- Консольные приложения (Console Applications) - работают в терминале/командной строке, не имеют графического интерфейса, используются для скриптов, утилит, серверных задач.
- Графические приложения (GUI Applications) - имеют окна, кнопки, меню, мышь, клавиатуру. Подразделяются на однооконные, многооконные (MDI), системные трей-приложения (фоновые процессы) и полноэкранные приложения (игры, например).
- Сервисы / Демоны (Background Services) - работают в фоне без UI, запускаются при старте системы.
- Плагины / Расширения, которые дополняют функционал других приложений.
Процесс разработки в NET
Прежде, чем приступать к исследованию порядка разработки приложений на платформе .NET, рассмотрим основные технологии, которые используются здесь.
Консольное приложение Приложение, которое может быть запущено в командной строке Windows, называется консольным приложением. Создание консольного приложения — это, в идеале, первый шаг для любого новичка в .Net.
Windows Forms
★ Windows Forms (WinForms) – старейший фреймворк Microsoft для разработки десктоп-приложений под Windows. Он строится на основе библиотеки System.Windows.Forms, которая является обёрткой над Win32 API. Все элементы управления (controls) – это «тяжёлые» окна Windows (HWND). Работает в одном потоке, UI-потоке.
Состав приложения Windows Forms:
- App.cs – точка входа, содержит метод Main(), запускающий приложение;
- Form1.cs / Form1.Designer.cs – главная форма (или любое другое окно). Форма – это класс, унаследованный от System.Windows.Forms.Form;
- Controls – элементы управления (TextBox, Button, Label и т.д.), создаются программно или через дизайнер.
В WinForms всё создаётся в коде или через визуальный дизайнер в Visual Studio.
Основные элементы:
| Элемент | Описание |
|---|---|
| Form | Основное окно приложения |
| Button | Кнопка |
| Label | Текстовая метка |
| TextBox | Поле ввода текста |
| RadioButton | Переключатели |
| CheckBox | Чекбоксы |
| Panel, GroupBox | Контейнеры для группировки элементов |
| MenuStrip, ToolStrip | |
| StatusStrip | Панель меню, инструментов, статуса |
WPF
★ WPF (Windows Presentation Foundation) – современный фреймворк для создания настольных приложений с богатым UI, поддерживающий декларативный стиль разработки через XAML. WPF использует DirectX для отрисовки интерфейса (в отличие от GDI+ у WinForms), поддерживает MVVM паттерн.
Состав приложения WPF:
- App.xaml – точка входа приложения, может содержать ресурсы и перехват событий;
- MainWindows.xaml / Window – основное окно приложения;
- XAML – язык разметки для описания UI;
- Code-behind – файл .xaml.cs, связанный с XAML, содержит логику обработки событий;
- Resources – стили, шаблоны, строки, изображения и т.д., определяемые в XAML.
Основные теги и элементы в XAML:
| Тег | Описание |
|---|---|
<Window> | Основное окно |
<UserControl> | Компонент, не являющийся окном |
<Grid>, <StackPanel> | |
<DockPanel> | Контейнеры компоновки |
<Button>, <Label>, <TextBox> | Элементы управления |
<Style> | Стили оформления |
<Template> | Шаблоны элементов |
<Trigger> | Триггеры изменений свойств |
<ResourceDictionary> | Хранение ресурсов (стилей, шаблонов и т.д.) |
<Binding> | Привязка данных (часть MVVM) |
.NET MAUI
★ MAUI (Multi-platform App UI) предназначена для кроссплатформенной разработки приложений для Windows, macOS, Android, iOS. Это эволюция Xamarin.Forms, использующая XAML для описания UI, и один и тот же XAML будет отображаться как нативный элемент на каждой платформе.
Состав приложения MAUI:
- MauiProgram.cs – точка входа, создаёт экземпляр приложения;
- App.xaml / AppShell.xaml – глобальные стили, маршруты, темы;
- MainPage.xaml – главная страница;
- Platforms/ - папка с платформозависимыми настройками;
- Resources/ - стили, изображения, цвета и т.д.
Основные теги в MAUI:
| Тег | Описание |
|---|---|
<ContentPage> | Одностраничное представление |
<Shell> | Для навигации (заменяет NavigationPage и TabbedPage) |
<StackLayout>, <Grid>, <FlexLayout> | Контейнеры компоновки |
<Label>, <Button>, <Entry>, <Image> | Элементы управления |
<Style> | Стили |
<ResourceDictionary> | Ресурсы приложения |
<OnPlatform> | Платформозависимые настройки |
<Routing> | Навигационные маршруты |
Сравнительная таблица WinForms, WPF, MAUI
| Критерий | WinForms | WPF | MAUI |
|---|---|---|---|
| Язык разметки | Нет (только код) | Есть (XAML) | Есть (XAML) |
| Платформа | Только Windows | Только Windows | Кроссплатформа |
| База UI | Win32 API | DirectX | Нативные элементы |
| Архитектура | Простая, событийная | MVVM, привязки, стили | MVVM, привязки, кросс-платформа |
| Производительность | Высокая | Высокая | Зависит от платформы |
| Современность | Устаревающая | Актуальная (но замедляется развитие) | Самая современная |
| Использование | Простые десктоп-приложения | Богатые Windows-приложения | Мобильные и кросс-платформенные решения |
Алгоритм разработки десктопного приложения в .NET
- Определение целевой платформы и технологии:
- Windows или кроссплатформа?
- WinForms (простое), WPF (более богатый UI) или MAUI?
- Создание проекта в Visual Studio – выбор шаблона, указание имени проекта и пути сохранения.
- Организация структуры кода:
Для WinForms:
- MyApp/:
- Models/
- Views/
- Controllers/
- Program.cs
Для WPF:
- MyApp:/
- Models/
- ViewModels/
- Views/
- App.xaml
- MainWindow.xaml
Для MAUI:
- MyApp:/
- Models/
- ViewModels/
- Views/
- MauiProgram.cs
- AppShell.xaml
Всегда надо стараться выносить логику в отдельные классы, чтобы код был чище.
- Проектирование макета приложения. Нужно нарисовать через специальные программы или на бумаге (а то и вовсе в голове) то, какие элементы будут на форме, как пользователь будет взаимодействовать с ними и что они должны выполнять.
Примеры – поля ввода (TextBox), кнопки (Button), Списки (ComboBox, ListBox), Метки (Label), таблицы и прочее.
В WPF и MAUI можно использовать XAML-редактор для прототипирования.
-
Создание формы и расстановка элементов. Используя визуальный конструктор форм (дизайнер), или редактируя XAML напрямую – создаём элементы и настраиваем их свойства. Элементы можно перетаскивать с панели инструментов, а свойства настраиваются через окно Properties.
-
Настройка обработчиков событий. Двойной клик по элементу (кнопке, допустим), создаёт метод в Form1.cs в Windows Forms. Соответственно, в WPF / MAUI настраивается всё в .xaml.cs файле – это специальный класс для обработчиков.
Словом, после создания элементов, нужно их «оживить», добавив методы в коде и привязав их к элементам.
Пример:
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Вы нажали кнопку!");
}
Здесь мы создали метод button1_Click, который привязан к элементу button1, и выполняет вывод сообщения с текстом. В WPF / MAUI к элементу добавляется атрибут Click в XAML:
<Button Text="Нажми меня" Clicked="OnButtonClicked"/>
а в .xaml.cs создаётся метод который указан в значении атрибута:
private void OnButtonClicked(object sender, EventArgs e)
{
DisplayAlert("Информация", "Кнопка нажата", "OK");
}
- Реализация бизнес-логики и работы с данными. Создаются модели (классы, представляющие данные), сервисы (классы для работы с БД, API, логикой), контроллеры / ViewModels (отвечающие за связь между UI и моделью).
- Проверка зависимостей и качества кода. Здесь нужно убедиться, что все ссылки добавлены, нет ли ошибок в логике, производится отладка, добавляются юнит-тесты, словом – финальные штрихи по оттачиванию «под капотом».
- Настройка внешнего вида и компоновки. Настраиваются размеры окон, цвета, шрифты, упорядочиваются элементы, применяются стили и темы.
- Запуск и тестирование. Проект запускается, функции тестируются, выполняется проверка того, как выглядит приложение на разных экранах и исправление багов.
Процесс разработки в Java
Процесс разработки в Java, Jetbrains Idea
Процесс разработки в Python
Процесс разработки в Python